#include "MySPI.h"


//初始化SPI 
//无参
//无返回值
void MySpi_init(void)
{
	//开启spi以及对应的GPIO时钟
	rcu_periph_clock_enable(MYSPI_RCU_GPIOX);
	rcu_periph_clock_enable(MYSPI_RCU_SPIX);
	
	//配置各引脚输出模式和复用
	gpio_af_set(GPIOA,GPIO_AF_0,MYSPI_CLK | MYSPI_MISO | MYSPI_MOSI);
	gpio_mode_set(GPIOA,GPIO_MODE_AF,GPIO_PUPD_NONE, MYSPI_CLK | MYSPI_MOSI| MYSPI_MISO);
	gpio_output_options_set(GPIOA,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ, MYSPI_CLK | MYSPI_MOSI| MYSPI_MISO);

	
	spi_parameter_struct spi_init_structure={0};
	
	//恢复SPI缺省配置，防止出现意外错误
	spi_i2s_deinit(MYSPI_SPIX);
	//声明SPI配置结构体
	spi_struct_para_init(&spi_init_structure);
	//SPI0模式
	spi_init_structure.clock_polarity_phase=SPI_CK_PL_LOW_PH_1EDGE;
	//主机模式
	spi_init_structure.device_mode=SPI_MASTER;
	//高位先行
	spi_init_structure.endian=SPI_ENDIAN_MSB;
	//8位数据
	spi_init_structure.frame_size=SPI_FRAMESIZE_8BIT;
	//软件触发
	spi_init_structure.nss=SPI_NSS_SOFT;
	//2分频
	spi_init_structure.prescale=SPI_PSC_2;
	//全双工
	spi_init_structure.trans_mode=SPI_TRANSMODE_FULLDUPLEX;
	//初始化SPI
	spi_init(MYSPI_SPIX,&spi_init_structure);
	
	spi_fifo_access_size_config(MYSPI_SPIX,SPI_BYTE_ACCESS);
	//使能SPI
	spi_enable(MYSPI_SPIX);
	
}

//SPI读写一位数据
//参数：txdata  要发送的数据
//返回值：接受到的一位数据
uint8_t MySpi_ReadWriteByte(uint8_t txdata)
{
	//等待数据发送寄存器空
	while(spi_i2s_flag_get(MYSPI_SPIX,SPI_FLAG_TBE) != 1);
	//发送数据
	spi_i2s_data_transmit(MYSPI_SPIX,txdata);
	//等待数据接收寄存器非空
	while(spi_i2s_flag_get(MYSPI_SPIX,SPI_FLAG_RBNE) != 1);
	//接收并返回数据
	return spi_i2s_data_receive(MYSPI_SPIX);
}

//SPI写一串数据（不关心读）
//参数：wdata 要发送的数组
//参数：dataslen 要发送的数组的长度
//无返回值
void MySpi_Write(uint8_t* wdata,uint16_t dataslen)
{
	//循环发送数据
	for(uint16_t i=0;i<dataslen;i++)
	{
		MySpi_ReadWriteByte(wdata[i]);
	}
}

//SPI读一串数据（不关心写）
//参数：rdata 要接收的数组
//参数：dataslen 要接收的长度
//无返回值
void MySpi_Read(uint8_t* rdata,uint16_t datalen)
{
	//循环接收数据
	for(uint16_t i=0;i<datalen;i++)
	{
		rdata[i] = MySpi_ReadWriteByte(0xff);
	}
}

